import random
import sys
from turtle import *

#创建海龟对象
def block():#这个函数用来实例化一个海龟对象
    file=Turtle(shape="square")
    file.pu()
    file.color("white","red")
    file.shapesize(2,2,1)
    return file

#彩色瓷砖创建
def board():
    global s,file
    s=[]
    file=[]
    #for循环来排列25个海龟对象
    for y in range(0,5):
        for x in range(-2,3):
            s.append(block())
            s[-1].goto(x*40,y*40)
            s[-1].fillcolor(color[array[y][x+2]])
        file.append(s)#全是海龟对象的数组，对应int类型的数组
        s=[]
#取色板创建
def color_choose_board():#这个函数实例化五个海龟对象，用作取色板
    global color_board
    color_board=[]
    for x in range(-2,3):
        color_board.append(block())
        color_board[-1].color("black",color[x+3])
        color_board[-1].goto(x*40,-60)

#鼠标点击事件
tempi=[]#i,j存储方块位置，x存储取色板序号
tempj=[]
tempx=[]
def fun(a,b):
    global tempi,tempj,tempx
    i=int((a+100)//40)
    j=int((b+20)//40)
    if 0<=i<5 and 0<=j<5:#判定鼠标点击范围在哪个方块
        tempi.append(i)
        tempj.append(j)
        file[tempj[-1]][tempi[-1]].pencolor("black")
        if len(tempi)>1:
            file[tempj[-2]][tempi[-2]].pencolor("white")
            del tempi[-2]#删除上次点击的方块的位置
            del tempj[-2]
        update()

    x=int((a+100)//40)
    y=int((b+70)//40)
    if 0<=x<5 and y==0:#判定鼠标点击哪个取色板
        tempx.append(x)
        if len(tempx)>1:
            del tempx[-2]#删除上次点击的取色板序号
        try:
            array_func( tempj[0]+1,tempi[0]+1,tempx[0]+1 )#传递点击的方块，取色板数据
        except:
            pass
#回溯算法，传递参数，得到新的数组
def array_func(x1,y1,c1):
    global array
    mx = [1, 0, 0, -1]
    my = [0, -1, 1, 0]#代表向四个方向
    def dfs(x , y, c):
        for i in range(0, 4):#向四个方向延伸
            tx = x + mx[i]
            ty = y + my[i]
            if (tx < 1 or tx > 5) or (ty < 1 or ty > 5):#排除边界外的点
                pass
            else:
                array[x - 1][y - 1] = c#改变颜色
                if array[tx - 1][ty - 1] == b:
                    dfs(tx, ty, c)
    flag = 0
    b = array[x1 - 1][y1 - 1]  # 存下原来颜色
    dfs(x1, y1, c1)
    for j in range(0, 5):
        for k in range(0, 5):
            if array[j][k] != c1:
                flag = 1
    for y in range(5):
        for x in range(5):
            file[y][x].fillcolor(color[array[y][x]])#重新绑定颜色，对象数组和int数组一一对应 
    update()
    


if __name__=="__main__":
    #数组与颜色绑定
    color = {1:"red",2:"green",3:"yellow",4:"blue",5:"purple"}#颜色代号
    array = [[random.randint(1, 5) for j in range(1, 6)]for i in range(1, 6)]
    #创建screen
    size =getscreen().screensize()
    w = size[0]
    h = size[1]
    setup(2*w,2*h)
    tracer(False)
    #启动程序
    color_choose_board()
    board()
    #监听事件更新数据
    listen()
    onscreenclick(fun)
    hideturtle()
    update()
    done()